using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using CapaAccesoDatos;
using CapaAccesoDatos.Clases;
using System.IO;

namespace CapaNegocios
{
    /// <summary>
    /// Provee metodos para la presentacion de reportes acerca de las estadisticas del sistema.
    /// </summary>
    public static class Estadisticas
    {
        /// <summary>
        /// Retorna las estadisticas del sistema dentro de un tiempo determinado. Este es el conteo de 
        /// todos los eventos que se registran en el sistema.
        /// </summary>
        /// <param name="TiempoInicio">El extremo inferior del intervalo.</param>
        /// <param name="TiempoFin">El extremo superior del intervalo.</param>
        /// <returns>Un string con todas las estadisticas agrupadas.</returns>
        public static string GetIntervalStats(DateTime TiempoInicio, DateTime TiempoFin)
        {
            return "Reservaciones" + " " + ReservacionCAD.GetReservacionesCount(TiempoInicio, TiempoFin) + "," +
                   "Sanciones" + " " + SancionCAD.GetSancionesCount(TiempoInicio, TiempoFin) + "," +
                   "Cancelaciones" + " " + ReservacionCAD.GetCancelacionesCount(TiempoInicio, TiempoFin) + "," +
                   "Infracciones" + " " + UsuarioEnObservacionCAD.GetInfraccionesCount(TiempoInicio, TiempoFin) + "," +
                   "Rechazos" + " " + RechazoCAD.GetRechazosCount(TiempoInicio, TiempoFin);
        }

        /// <summary>
        /// Retorna todas las estadisticas del sistema. Este es el conteo de 
        /// todos los eventos que se registran en el sistema.
        /// </summary>
        /// <returns>Un string con todas las estadisticas agrupadas.</returns>
        public static string GetCompleteStats()
        {
            return "Reservaciones" + " " + ReservacionCAD.GetReservacionesCount() + "," +
                   "Sanciones" + " " + SancionCAD.GetSancionesCount() + "," +
                   "Cancelaciones" + " " + ReservacionCAD.GetCancelacionesCount() + "," +
                   "Infracciones" + " " + UsuarioEnObservacionCAD.GetInfraccionesCount() + "," +
                   "Rechazos" + " " + RechazoCAD.GetRechazosCount();
        }

        /// <summary>
        /// Crea un archivo separado por comas (.csv) con las estadisticas del sistema.
        /// </summary>
        public static void CreateCSV()
        {
            FileStream ArchivoCSV = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\Stats.csv", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamWriter Writer = new StreamWriter(ArchivoCSV);

            foreach (String StringToWrite in Estadisticas.GetCompleteStats().Split(','))
            {
                foreach (String StrPiece in StringToWrite.Split(' '))
                {
                    Writer.Write(StrPiece + ",");
                }
                Writer.WriteLine("");
            }
            Writer.Close();
            ArchivoCSV.Close();
        }

        /// <summary>
        /// Crea un archivo separado por comas (.csv) con las estadisticas del sistema 
        /// dentro de un intervalo determinado.
        /// </summary>
        /// <param name="TiempoInicio">El extremo inferior del intervalo.</param>
        /// <param name="TiempoFin">El extremo superior del intervalo.</param>
        public static void CreateCSVInterval(DateTime TiempoInicio, DateTime TiempoFin)
        {
            FileStream ArchivoCSV = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\Stats.csv", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamWriter Writer = new StreamWriter(ArchivoCSV);

            foreach (String StringToWrite in Estadisticas.GetIntervalStats(TiempoInicio, TiempoFin).Split(','))
            {
                foreach (String StringPiece in StringToWrite.Split(' '))
                {
                    Writer.Write(StringPiece + ",");
                }
                Writer.WriteLine("");
            }
            Writer.Close();
            ArchivoCSV.Close();
        }
    }
}
